import { useEffect, useRef } from 'react';
import WS from '../utils/websocket';
import WEBSOCKET_TYPES from '../utils/WEBSOCKET_TYPES';

/**
 *
 * @param {*} userCode 用户标识
 * @param {*} roomId 房号😄，同roomId即可互相广播
 * @param {*} event 订阅的事件，例如 jms.topic.interview111，
 * @param {*} disconnectHandler 掉线事件，报文格式无法控制独立处理，
 * 录音的场景比较特殊,所有事件均需要广播。
 * 所以只订阅一个事件,具体的事件用报文 body 的 type 属性进行区分。
 */
const useSocket = (userCode, roomId, event, eventHandler, disconnectHandler) => {
    const wsRef = useRef(null);
    useEffect(() => {
        console.log('socket 实例创建');
        wsRef.current = new WS(userCode, roomId, event);
        wsRef.current.connect();

        // 处理事件监听
        wsRef.current.subscribe(event, res => {
            eventHandler(res);
        });
        // 上下线事件使用独立的事件
        wsRef.current.subscribe(`jms.topic.${roomId}`, res => {
            disconnectHandler(res);
        });

        wsRef.current.send({
            type: WEBSOCKET_TYPES.ONLINE,
            data: { userCode, isPassive: false }
        });

        return () => {
            console.log('websocket组件开始卸载');
            wsRef.current.send({
                type: WEBSOCKET_TYPES.OFFLINE,
                userCode
            });
            wsRef.current.disconnect();
            wsRef.current = null;
        };
    }, []);

    return [wsRef];
};

export default useSocket;
